package vip.web3.common.utils;

import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件上传工具类
 */
@Component
public class UploadUtils {

    @Resource
    private AliyunOssUtils aliyunOssUtils;

    /**
     * 文件名分隔符
     */
    public static String cut = "_";

    /**
     * 对外暴露接口 文件上传
     *
     * @param base64File base64 文件
     * @param rootpath 文件根路径
     * @param dirPath 上传文件夹路径
     * @param suffix  文件后缀名
     * @return 文件路径
     */
    public R uploadBase64(String base64File, String rootpath, String dirPath, String suffix, Boolean isOss) {
        if(isOss == null || !isOss){
            return upload(Base64Utils.getStringImage(base64File), rootpath, dirPath, suffix);
        } else {
            return aliyunOssUtils.uploadByte(Base64Utils.getStringImage(base64File), suffix);
        }
    }

    /**
     * 对外暴露接口 文件上传
     * 流文件上传 根据byte数组，生成文件
     *
     * @param file   文件流
     * @param rootpath 文件根路径
     * @param dirPath 上传文件夹路径
     * @param suffix  文件后缀名
     * @return 文件路径
     */
    public R uploadFile(byte[] file, String rootpath, String dirPath, String suffix, Boolean isOss) {
        if(isOss == null || !isOss){
            return upload(file, rootpath, dirPath, suffix);
        } else {
            return aliyunOssUtils.uploadByte(file, suffix);
        }
    }

    /**
     * 流文件上传 根据byte数组，生成文件
     *
     * @param bfile   文件流
     * @param rootpath 文件根路径
     * @param dirPath 上传文件夹路径
     * @param suffix  文件后缀名
     * @return 文件路径
     */
    public R upload(byte[] bfile, String rootpath, String dirPath, String suffix) {
        R returnMsg = new R();
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try {
            long uniqueTime = System.currentTimeMillis();
            int uniqueNum = (int)((Math.random() * 9 + 1) * 100000);
            String fileName = uniqueTime + cut + uniqueNum + suffix;
            String path = dirPath + "/" + fileName;

            file = new File(path);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(bfile);
            returnMsg.put("dirPath", rootpath + dirPath + "/"+ fileName);
        } catch (Exception e) {
            returnMsg = R.error("文件上传失败");
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return returnMsg;
    }

}
